\chapter{Implémentation des structures du code et du cryptosystème}

	En plus du volet théorique développé ci-dessus, nous avons implémenté une version du cryptosystème de Mc Eliece.
	Notre code développé en Python ne nous permet pas d'atteindre les standards de sécurité mais fonctionne avec des paramètres plus modestes.
	Nous livrons dans cette partie quelques morceaux de codes intéressant.
	Si cela vous intéresse, la totalité des sources est disponible sur Github (\url{https://github.com/kalaspa/mc-eliece}). 

	\section{Structures algébriques}

		Dans un but pédagogique nous avons redéfini des classes de polynômes et de matrices.
		L'intérêt supplémentaire est que ces classes fonctionnent aussi bien avec des nombres réels qu'avec nos classes d'éléments de Galois.
		Ceci est permis par la surcharge des opérateurs dans le langage python.
		Les classes de matrices et de polynômes n'ont en soit pas grand chose d'intéressant.

		Un élément d'un corps de Galois sur $\mathbb{F}_{2^{m}}$ est un polynôme de $\mathbb{Z}/2\mathbb{Z}[X]/P$
		avec P un polynôme irréductible de $\mathbb{Z}/2\mathbb{Z}[X]$ .
		Notre implémentation repose sur la compréhension du binaire par l'interpréteur Python :
		un entier est stocké sous sa forme binaire sur laquelle on peut effectuer des opérations binaires (xor, and, or et décalages de bits).
		Grâce à cette caractéristique de Python on peut utiliser des entiers comme des polynômes de $\mathbb{Z}/2\mathbb{Z}$.
		On obtient une structure d'éléments de $\mathbb{F}_{2^{m}}$ très rapide.

		\lstinputlisting[firstline=11, lastline=21]{../Classes/galois.py}

		Ici d est une fonction qui calcule la différence de degré entre deux polynômes.
		Elle est équivalente avec nos considérations à $log_{2}(n) - log_{2}(p)$.
		p représente le polynôme qui forme l'idéal.

	\section{Structures de clef}

		Nous avons défini des classes de clef.
		Celles-ci sont des ensembles contenant les informations nécessaires.

		\subsection{Clef privée}

			La clef privée est l'objet qui permet à la fois le décryptage et la création de la clef publique.

			Elle est déclarée comme suit :

			\lstinputlisting[firstline=152, lastline=165]{../Classes/clef.py}

			Pour des considérations de rapidité et pour ne pas se répéter, on stocke les matrices inverses de Q.
			L\_fi est la liste des polynômes défini en  définition \ref{fi}, ils permettent de calculer le syndrome directement sous forme de polynôme.

			La création de la clef privée se fait de manière aléatoire avec cette méthode :

			\lstinputlisting[firstline=221, lastline=254]{../Classes/clef.py}

			Les algorithmes sous-jacents ont été explicités de manière théorique précédemment.

		\subsection{Clef publique}

			La clef publique est l'objet diffusé. 
			Elle contient uniquement la matrice G' et la capacité de correction.
			Elle est crée à partir de la clef privée avec cette méthode :

			\lstinputlisting[firstline=141, lastline=144]{../Classes/clef.py}

			On notera le gain de temps en effectuant d'abord le produit matriciel des matrices de plus petite taille.